Skip to content

fix(nextly): migrate:fresh drops the tables it actually found - #1736

Merged
mobeenabdullah merged 3 commits into
mainfrom
fix/migrate-fresh-drops-what-it-found
Sep 10, 2026
Merged

mobeenabdullah merged 3 commits into
mainfrom
fix/migrate-fresh-drops-what-it-found

Conversation

@mobeenabdullah

@mobeenabdullah mobeenabdullah commented Sep 10, 2026 •

Copy link
Copy Markdown
Collaborator

The destructive site from finding:pg-schema-pinned-in-seven-places, now that
#1729 has released the file.

The bug

migrate:fresh empties the database and rebuilds it. Two steps:

  1. discover — SELECT tablename FROM pg_tables WHERE schemaname = 'public'
  2. drop — DROP TABLE IF EXISTS "name" CASCADE, with no schema on it

Step 2 resolves through the search_path. Step 1 named one schema. Reading
dropTable is what showed this is worse than the finding recorded — the two
steps disagree in both directions at once.

On a search_path of tenant, public:

  • Nextly's own tables live in tenant. Step 1 cannot see them, so they survive
    the reset
    — migrate:fresh silently does not do its job.
  • Whatever else lives in public is listed, and handed to step 2.

Why current_schema() and not to_regclass

#1721 fixed a different question. Those reads asked "does this NAME resolve?",
which to_regclass answers by walking the whole path. This one asks "which
tables are MINE to destroy?"
, and the answer is where an unqualified CREATE
lands — current_schema().

That is also exactly where the unqualified DROP will go, so discovery and
destruction now ask the same question. Same principle as #1721, different tool,
because it is a different question.

Deliberately not the whole search path. Dropping less than intended leaves a
table behind; dropping more destroys data this command was never pointed at, and
only one of those is recoverable.

No shared predicate, no new export

#1732 was closed on a correct Codex P1 for exporting a raw-SQL API to reach
callers like this one. This needs neither: it is a single query with a shape of
its own, written in place.

Evidence

discoverTables is now exported for the same reason disableForeignKeyChecks
already is — what it asks the database decides what this command destroys, and
that deserves a test that does not have to drive the whole command to reach it.

Three assertions, each break-verified to fail alone:

mutation fails
back to schemaname = 'public' (the shipped defect) "asks for the schema the DROP will resolve to"
drop the scope entirely same test
MySQL loses DATABASE() "still scopes MySQL to the connected database"

That last one is the control: "does not say public" is also satisfied by a
query scoping to nothing, which on this command would enumerate every table
the role can see.

Gates

nextly check-types 0 · lint 0 · vitest 0 (11,892 tests) · fallow audit
pass, every *_introduced 0 over 3 files · changeset status 0.

Summary by CodeRabbit

  • Bug Fixes
    • Improved fresh migration table discovery for PostgreSQL, including tables in visible search-path schemas while excluding system schemas.
    • Improved MySQL table discovery to correctly scope results to the active database.
    • Increased reliability of foreign-key handling across PostgreSQL, MySQL, and SQLite, including clearer propagation of permission errors.

@coderabbitai

coderabbitai Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

Warning

Review limit reached

Next included review available in 37 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 2cc64320-6fd1-4363-a2ec-3f614cbc20c5

📥 Commits

Reviewing files that changed from the base of the PR and between 5efd96d and cd971ab.

📒 Files selected for processing (2)
  • packages/nextly/src/cli/commands/__tests__/migrate-fresh-fk.test.ts
  • packages/nextly/src/cli/commands/migrate-fresh.ts

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: ad37f340-99e9-4ae6-9cd4-fb970f6a6074

📥 Commits

Reviewing files that changed from the base of the PR and between 110d2bc and 5efd96d.

⛔ Files ignored due to path filters (1)
  • .changeset/migrate-fresh-drops-what-it-found.md is excluded by !.changeset/**
📒 Files selected for processing (2)
  • packages/nextly/src/cli/commands/__tests__/migrate-fresh-fk.test.ts
  • packages/nextly/src/cli/commands/migrate-fresh.ts

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

The change adds search-path-aware PostgreSQL table discovery, keeps MySQL discovery database-scoped, and narrows migration helper functions to the SqlRunner contract. Tests use the shared type and cover discovery and foreign-key behavior.

Changes

Migration SQL contracts

Layer / File(s) Summary
Search-path-aware table discovery
packages/nextly/src/cli/commands/migrate-fresh.ts, packages/nextly/src/cli/commands/__tests__/migrate-fresh-fk.test.ts
Exports SqlRunner and discoverTables. PostgreSQL discovery uses visible regular and partitioned relations across the search path and excludes system schemas. MySQL discovery remains scoped to DATABASE().
Narrow foreign-key helper adapters
packages/nextly/src/cli/commands/migrate-fresh.ts, packages/nextly/src/cli/commands/__tests__/migrate-fresh-fk.test.ts
Replication-role and foreign-key helpers accept SqlRunner. Tests remove adapter casts while retaining permission, propagation, and SQLite coverage.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers: aqib-rx

Merge Risk: ⚪ Minimal · up to 5efd9

This change makes the fresh-migration reset discover exactly the tables that an unqualified drop would resolve through the database search path, closing a gap where tables outside the default schema could survive a reset. No unresolved correctness or data-loss concerns remain, and the accompanying tests cover both PostgreSQL and MySQL scoping.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the main fix: migrate:fresh now drops the tables it discovers. It is concise and specific.
Description check ✅ Passed The description explains the bug, root cause, implementation, testing strategy, and validation results. It does not reproduce every template heading or checklist item, but it provides the required sub…
Docstring Coverage ✅ Passed Docstring coverage is 85.71% which is sufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 7 functions across 2 files.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/migrate-fresh-drops-what-it-found

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-10T22:27:19.193997Z cd971ab Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex review

@github-actions github-actions Bot added scope: core nextly type: docs Documentation only labels Sep 10, 2026
@github-actions

github-actions Bot commented Sep 10, 2026 •

Copy link
Copy Markdown
Contributor

Whole-Repository Code Hygiene Summary

Full dead-code, duplication, and complexity report for the PR branch as it stands now. Playground is excluded. Quality gate enforcement on introduced issues is performed by the Changed files job.

🌿 Fallow

Warning

Review needed

⚠️ 73 code issues · ⚠️ 694 clone groups · ⚠️ 1046 health findings

See inline review comments for per-finding details.

Code issues (73)
Category Count
Unused files 2
Unused exports 5
Unused dependencies 19
Unused devDependencies 6
Unresolved imports 2
Unlisted dependencies 1
Circular dependencies 38
Duplication (694 groups · 29014 lines · 4.1%)
Locations Lines Tokens
schemas/_dialect-bundles/mysql.relations.ts:40-134
schemas/_dialect-bundles/postgres.relations.ts:40-134
schemas/_dialect-bundles/sqlite.relations.ts:40-134
95 593
cli/commands/db-sync-demote.ts:70-75
cli/commands/db-sync-promote.ts:38-43
cli/commands/dev-build.ts:100-105
cli/commands/dev-build.ts:179-184
cli/commands/dev-build.ts:299-304
cli/commands/dev-build.ts:411-416
cli/commands/dev-build.ts:552-557
cli/commands/dev-server.ts:575-580
cli/commands/dev-server.ts:840-845
cli/commands/dev-server.ts:1143-1148
cli/commands/migrate-field-groups.ts:110-115
6 70
entries/EntryList/EntryTableSkeleton.tsx:74-98
collection/components/CollectionTableSkeleton.tsx:94-118
field-group/components/FieldGroupTableSkeleton.tsx:90-114
plugins/components/PluginsTableSkeleton.tsx:86-110
singles/components/SinglesTableSkeleton.tsx:77-101
src/components/table-skeleton.tsx:100-124
25 89
collections/config/validate-config.ts:380-433
field-groups/config/validate-field-group.ts:185-238
singles/config/validate-single.ts:190-243
54 152
dispatcher/handlers/collection-dispatcher.ts:922-964
field-groups/services/field-group-table-provisioning.ts:186-236
singles/services/reconcile-single-companion.ts:110-160
51 149

… and 689 more groups.

Across 423 files.

Complexity (1046 functions above threshold)
File Function Severity Cyclomatic Cognitive CRAP Lines
singles/services/single-mutation-service.ts:981 <arrow> critical 251 ! 324 ! 13859.2 ! 1625
collections/services/collection-mutation-service.ts:6209 <arrow> critical 174 ! 177 ! 6713.6 ! 1301
src/init/reload-config.ts:1319 applyReload critical 144 ! 228 ! 4623 ! 1433
shared/lib/entry-validation.ts:223 validateFieldValue critical 109 ! 157 ! 2675.3 ! 432
blocks-engine/src/measure-bytes.ts:646 surveyDocument critical 102 ! 250 ! 137.1 ! 658

4987 files, 76146 functions analyzed (thresholds: cyclomatic > 20, cognitive > 15, CRAP >= 30)

Codebase health

Metric Value
Maintainability 91.7 / 100
Avg complexity 1.8

Tip

Run fallow fix --dry-run to preview auto-fixes.
Add /** @public */ above exports to preserve them.

@pkg-pr-new

pkg-pr-new Bot commented Sep 10, 2026 •

Copy link
Copy Markdown

Open in StackBlitz

@nextlyhq/adapter-drizzle

npm i https://pkg.pr.new/@nextlyhq/adapter-drizzle@cd971ab

@nextlyhq/adapter-mysql

npm i https://pkg.pr.new/@nextlyhq/adapter-mysql@cd971ab

@nextlyhq/adapter-postgres

npm i https://pkg.pr.new/@nextlyhq/adapter-postgres@cd971ab

@nextlyhq/adapter-sqlite

npm i https://pkg.pr.new/@nextlyhq/adapter-sqlite@cd971ab

@nextlyhq/admin

npm i https://pkg.pr.new/@nextlyhq/admin@cd971ab

@nextlyhq/admin-css

npm i https://pkg.pr.new/@nextlyhq/admin-css@cd971ab

@nextlyhq/blocks-engine

npm i https://pkg.pr.new/@nextlyhq/blocks-engine@cd971ab

@nextlyhq/blocks-react

npm i https://pkg.pr.new/@nextlyhq/blocks-react@cd971ab

@nextlyhq/builder

npm i https://pkg.pr.new/@nextlyhq/builder@cd971ab

create-nextly-app

npm i https://pkg.pr.new/create-nextly-app@cd971ab

@nextlyhq/eslint-plugin

npm i https://pkg.pr.new/@nextlyhq/eslint-plugin@cd971ab

nextly

npm i https://pkg.pr.new/nextly@cd971ab

@nextlyhq/plugin-form-builder

npm i https://pkg.pr.new/@nextlyhq/plugin-form-builder@cd971ab

@nextlyhq/plugin-page-builder

npm i https://pkg.pr.new/@nextlyhq/plugin-page-builder@cd971ab

@nextlyhq/plugin-sdk

npm i https://pkg.pr.new/@nextlyhq/plugin-sdk@cd971ab

@nextlyhq/plugin-seo

npm i https://pkg.pr.new/@nextlyhq/plugin-seo@cd971ab

@nextlyhq/storage-s3

npm i https://pkg.pr.new/@nextlyhq/storage-s3@cd971ab

@nextlyhq/storage-uploadthing

npm i https://pkg.pr.new/@nextlyhq/storage-uploadthing@cd971ab

@nextlyhq/storage-vercel-blob

npm i https://pkg.pr.new/@nextlyhq/storage-vercel-blob@cd971ab

@nextlyhq/ui

npm i https://pkg.pr.new/@nextlyhq/ui@cd971ab

commit: cd971ab

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 73145e7672

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
WHERE schemaname = current_schema()

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Resolve tables across the PostgreSQL search path

When search_path is tenant, public and a Nextly table exists only in public—for example, after prepending a tenant schema to an established database—an unqualified DROP TABLE "name" resolves to that fallback table, but this predicate excludes it because current_schema() returns only tenant. Consequently migrate:fresh leaves reachable tables and their data behind, potentially creating shadowing replacements during migration; use relation visibility/search-path resolution rather than assuming the first schema is the only drop target. The added test merely checks for the current_schema() token and therefore does not exercise this separating case.

AGENTS.md reference: AGENTS.md:L206-L213

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, and the counter-example is the one that breaks my reasoning: the
DROP walks the whole path, so current_schema() — only its first entry — is
NARROWER than the drop. A Nextly table sitting in public under a
tenant, public path is reachable by the drop and was invisible to my predicate.

I had argued "dropping less is recoverable, dropping more is not", which is true
in general and beside the point here: the safe set is not smaller-than-the-drop,
it is EQUAL to the drop. Anything smaller leaves tables the reset was supposed to
remove.

Discovery now asks visibility directly, which is that question and nothing else:

SELECT c.relname AS tablename
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p')
  AND n.nspname NOT IN ('pg_catalog', 'information_schema')
  AND pg_table_is_visible(c.oid)

pg_table_is_visible is true for the one relation of a given name the path
resolves to and false for the ones it shadows — exactly what the unqualified DROP
will reach. System schemas are excluded by name because pg_catalog is on every
path implicitly, so visibility alone would hand it to a DROP.

Break-verified three ways, each failing the same test alone: back to 'public',
back to current_schema(), and visibility without the system-schema exclusion.
The middle one is the version you rejected, so the test now discriminates against
it too.

Comment on lines +57 to +58
// eslint-disable-next-line @typescript-eslint/no-explicit-any
await discoverTables(adapter as any, "postgresql");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Type the adapter fake instead of suppressing checks

This new call, and the repeated MySQL call below it, introduce both as any and an eslint-disable solely to make the fake adapter fit DrizzleAdapter. Define the tested dependency as the required executeQuery surface or provide a genuinely typed test double instead; repository conventions explicitly reject both suppression mechanisms.

AGENTS.md reference: AGENTS.md:L280-L281

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed, and removing the cast proved your point in a way I did not expect.

I narrowed the three helpers to the surface they actually use — executeQuery
and nothing else — and exported it as SqlRunner, so the double is typed against
the real thing:

export type SqlRunner = Pick<DrizzleAdapter, "executeQuery">;

With the casts gone the file stopped compiling, because the hand-written fake did
NOT match: it declared executeQuery: (sql: string) => Promise<unknown> while the
real one is generic and takes params. The cast had been hiding a double that was
already wrong. The fake is now type FakeAdapter = SqlRunner, so a change to that
surface breaks it instead of slipping past.

as any and eslint-disable are both now at zero in the file — including the
three pre-existing uses in the FK tests, which the same narrowing made
unnecessary.

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5efd96dce7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +364 to +370
query = `
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY tablename
SELECT c.relname AS tablename
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
AND pg_table_is_visible(c.oid)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Build the discovery query through Drizzle

This PostgreSQL branch introduces a catalog query as a raw string and executes it through executeQuery, but database access in packages/nextly product code is required to use Drizzle rather than raw SQL strings. Build the query with Drizzle's sql API and execute it through the adapter's Drizzle instance.

AGENTS.md reference: AGENTS.md:L274-L276

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both fixed, and they turned out to be one change: composing the query in Drizzle
is what made the shared predicate reachable.

Drizzle. discoverTables now takes Pick<DrizzleAdapter, "queryStatement">
and composes all three dialect branches as sql fragments —
adapter.queryStatement being the Drizzle-native path document-lock-repository
already uses. No raw string reaches the driver from this function.

The canonical predicate. The PostgreSQL branch now interpolates
PG_CLASS_IS_THE_RELATION_THE_WRITES_HIT rather than my own
pg_table_is_visible(c.oid). You were right that the two are one question with
two spellings; the one I wrote could be corrected apart from the schema reads,
and then a destructive command and the introspection would disagree about which
table they mean. pg_class is aliased t so the shared fragment drops in
unchanged.

The test now renders the statement through PgDialect().sqlToQuery() and
asserts on the text the server would receive, rather than inspecting the fragment
object — a fragment built from the right pieces in the wrong order would satisfy
any assertion made against the pieces.

Break-verified three ways, each failing that test alone:

mutation why it matters
back to a 'public' predicate the shipped defect
quote_ident removed from the SHARED predicate proves the test now catches drift at the source, which is the whole reason to reuse it
system schemas no longer excluded pg_catalog is on every path implicitly, so visibility alone would hand it to a DROP

The middle row is the one I care about: before this change, breaking the shared
predicate could not fail this command's test, because this command had its own.

Gates: nextly check-types 0 · lint 0 · vitest 0 (11,892 tests) ·
fallow audit pass, every *_introduced 0 · changeset status 0.

JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p')
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
AND pg_table_is_visible(c.oid)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Reuse the canonical PostgreSQL visibility predicate

This independently reimplements the same relation-resolution question already centralized as PG_CLASS_IS_THE_RELATION_THE_WRITES_HIT in domains/schema/pipeline/pg-visible-relation.ts and used by schema introspection. A later correction to either implementation can make this destructive command discover a different relation from the schema write paths, so derive this condition from the existing canonical predicate instead of maintaining pg_table_is_visible in parallel.

AGENTS.md reference: AGENTS.md:L288-L291

Useful? React with 👍 / 👎.

@mobeenabdullah

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cd971ab94e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +80 to +81
expect(seen[0]).toContain("to_regclass");
expect(seen[0]).toContain("quote_ident");

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Assert returned relations instead of SQL tokens

Fresh evidence after the earlier thread: the revised test still only checks that the rendered SQL contains to_regclass and quote_ident; it remains green if the predicate is inverted with <> or combined using OR, either of which can enumerate and drop the wrong relations. Because this is the only regression test for the destructive search-path behavior, use a PostgreSQL fixture with tables in tenant and public and assert the actual rows returned so the test distinguishes correct resolution from these plausible broken implementations.

AGENTS.md reference: AGENTS.md:L218-L223

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right, and it is the rule I quoted at someone else this morning: a
necessary-but-insufficient property returns green from the broken implementation
too, carrying the authority of having been checked.

toContain("to_regclass") survives <> and it survives OR. On a command that
DROPS what it enumerates, that is not a regression test.

#1745 adds the database-backed one, with a fixture built so each plausible wrong
answer shows up as a different failing row:

table where expected which broken version it catches
shadowed tenant and public returned once a query returning every copy rather than the resolved one
public_only public, path is tenant, public returned current_schema() — the version I wrote first
hidden_only schema off the path not returned an inverted or OR-ed predicate
pg_class pg_catalog not returned visibility without the system-schema exclusion

Session-pinned to one pg.Client for the reason you raised on the sibling probe,
with a SHOW search_path case first so a reset session fails as a fixture
problem rather than as a defect in the predicate.

Still unexecuted here — no PostgreSQL on this machine — so the CI Postgres leg is
the verdict. The sibling probe uses this same harness and has since passed on all
three dialects.

@mobeenabdullah
mobeenabdullah merged commit e9adb7b into main Sep 10, 2026
15 of 18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

scope: core nextly type: docs Documentation only

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant