Skip to content

fix(db): keep source identity across query scopes - #1981

Merged
KyleAMathews merged 2 commits into
mainfrom
fix/issue-1975-source-identity
Oct 1, 2026
Merged

KyleAMathews merged 2 commits into
mainfrom
fix/issue-1975-source-identity

Conversation

@KyleAMathews

@KyleAMathews KyleAMathews commented Oct 1, 2026 •

Copy link
Copy Markdown
Collaborator

A live query returned no rows when an include used the same alias as a source in a joined from() subquery. Since 0.11.0, this query returns [] instead of [1]:

const filteredParts = q
  .from({ part: parts })
  .leftJoin({ ref: refs }, ({ part, ref }) => eq(ref.partId, part.id))
  .where(({ ref }) => eq(ref.clientId, 1))
  .where(({ part }) => eq(part.active, true))
  .select(({ part }) => part)

q.from({ part: filteredParts }).select(({ part }) => ({
  ...part,
  // Same alias ("ref") as the join inside the subquery
  refs: materialize(
    q.from({ ref: refs }).where(({ ref }) => eq(ref.partId, part.id)),
  ),
}))

Rename the include alias, and the query returns the expected rows. The alias name changed the result, and no error or warning appeared. This PR makes the result independent of alias names for the query forms that the new oracle covers. The plan now keeps the identity of each source. Compilation reads source input by that identity only.

Cause

Each CollectionRef has an opaque SourceId. The live query creates one input for each SourceId.

The optimizer copied, wrapped, and collapsed sources with new CollectionRef(collection, alias). Each copy received a new SourceId that no input used. The compiler did not find that ID. It then read the input by alias text. bindSourceInputs stored the input of every scope under its alias, so the last source with that name won. Here, the include's ref input replaced the input for the subquery's parts source.

This defect existed since #1740 added SourceId, but it had no effect. Before #1877, the compiler compiled the original subquery and discarded the optimized copy. #1877 compiles the optimized copy when that copy contains a pushed predicate. That is the intended behavior. The orphaned IDs then reached compilation. Bisection identifies 40a5aea56 (#1877) as the first bad commit.

This also explains the issue's "two predicates" condition. The ref.clientId filter is on the nullable side of a left join. The optimizer does not push it. The part.active filter moves into the subquery, and only that change makes the copy differ. One pushed source predicate is sufficient.

Repair

  1. The four optimizer sites that copy, wrap, or collapse a source now reuse the existing CollectionRef.
  2. bindSourceInputs maps caller inputs that use alias keys to SourceId keys once. It no longer stores inputs under alias keys.
  3. Both source lookups read allInputs[sourceId] only.

If a later rewrite loses a SourceId, compilation now raises CollectionInputNotFoundError. It cannot read a source with the same name from another scope. A test reverted each optimizer site with this binding in place. The existing suite then failed 3, 53, 146, and 59 tests. Compiler unit tests that supply alias-keyed inputs continue to work.

Alias rules that now raise errors

ARCHITECTURE.md normative law 1 requires that a legal alias rename cannot change an explicit projection. Review of that law found two namings that the builder accepted and that produced wrong rows:

  • A scope inside an include reused an alias that its ancestors can see. This applies to the include, a nested include, a unionAll() branch in an include, and a from() subquery in an include. These scopes can read the parent row in their callbacks. The correlation read the wrong source and returned empty children. These namings now raise DuplicateAliasInSubqueryError.
  • Two joins in one query used the same alias. This naming now raises QueryCompilationError.

A top-level from() subquery has no ancestor scope. It can still use the outer alias, as the issue query does. Sibling scopes can also use the same names.

A unionAll() row holds the projected fields of its branches, not their aliases. An include or a join on a unionAll() query can therefore use a branch alias. The compiler still rejects a name that two branches of one union repeat.

Oracle

The new owner is includes alpha-renaming across sibling scopes in includes-oracle.property.test.ts. Its grammar, model, and driver are in includes-scope-identity-oracle.ts. It generates four topologies that put a source next to a sibling source with the same name:

  • a from() subquery with an include
  • a joined unionAll() branch with an include
  • a collapsed top-level wrapper with a join subquery
  • an include directly on a joined unionAll(), which can use a branch alias

The grammar also changes these properties:

  • joins, predicates, and subquery bodies: plain, ordered with a limit, or DISTINCT
  • the shape of the include body
  • eager sources and on-demand sources

Each checkpoint occurs after preload and after each source write. Each checkpoint makes three comparisons:

  1. The canonical naming against a plain recomputation of the source rows.
  2. The generated naming against the canonical naming.
  3. The loadSubset WHERE clauses that each collection receives under the two namings.

One in four scenarios uses any naming. The test then requires the builder to reject each illegal naming. That check found the duplicate-join defect.

Every pinned witness and both campaigns fail on 18abceee4 and pass with this change. Each optimizer site mutant fails at least one witness. The previous oracle did not catch the collapse site. Planted model faults and an alias-dependent routing mutant each fail at their intended comparison.

Limits

These legal forms are in the bug class but outside the grammar:

  • nested includes and joined subqueries with groupBy
  • outer RIGHT and FULL joins
  • publication events and unload
  • ordered windows and lazy join loading, which read the alias-keyed aliasRemapping map
  • temporal demand

Probes did not find a failure in these forms. The coverage map and the review record list them with an owner. This PR does not claim that the alias bug class is closed.

Implementation map

  • Repair: query/optimizer.ts, query/compiler/index.ts (bindSourceInputs, validateQueryStructure), query/compiler/joins.ts. The production diff is +65 and −16 lines. The new alias rules use most of the added lines.
  • Contract: ARCHITECTURE.md §Identity and law 1. This change documents SourceId preservation and the single alias namespace across unionAll() branches.
  • Evidence: docs/contributing/oracle-reviews/issue-1975-scope-identity.md, oracle-coverage.md
  • Rejection witnesses: tests/query/validate-aliases.test.ts

Verification

  • pnpm --filter @tanstack/db test: 229 files and 7924 tests pass.
  • The new owner passes at TANSTACK_DB_ORACLE_RUNS_MULTIPLIER=10.
  • A seed and path from a failed run on 18abceee4 replay directly through TANSTACK_DB_ORACLE_PROPERTY=includes.scoped-alpha-renaming.
  • Lint, format, and tsc pass. The only tsc errors are in tests/conformance/, and they also occur on main.

Closes #1975

This pull request and its description were written by Isaac.

Summary by CodeRabbit

  • Bug Fixes

    • Query results now use the correct data source when nested or sibling scopes reuse alias names.
    • Queries with duplicate aliases in the same scope or aliases that shadow an ancestor scope now fail with a clear error. Reusing aliases in sibling scopes remains supported.
  • Tests

    • Added coverage for alias handling across nested queries, includes, joins, and unionAll branches.

Live queries returned no rows when an include reused an alias from a
joined from() subquery (#1975). The optimizer rebuilt CollectionRefs with
fresh SourceIds; since #1877 compiles the optimized subquery, the compiler
missed those IDs and fell back to alias text, which a sibling scope had
claimed.

- Optimizer copies, wraps, and collapses reuse the CollectionRef.
- Compilation binds inputs by SourceId only, so a lost identity raises
  CollectionInputNotFoundError instead of reading another source.
- No scope inside an include can shadow an ancestor alias, including in
  unionAll() branches and from()/join subqueries.
- One query cannot give two sources the same alias.

Adds a generated alpha-renaming oracle across sibling scopes with an
independent recomputation model, plus the review record and contract
updates.

Co-authored-by: Isaac <no-reply@databricks.com>
@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: 87b3f75c-a534-465a-8bdd-e69437c45a19

📥 Commits

Reviewing files that changed from the base of the PR and between 6602d78 and 62d7a8f.

📒 Files selected for processing (7)
  • docs/contributing/oracle-coverage.md
  • docs/contributing/oracle-reviews/issue-1975-scope-identity.md
  • packages/db/src/query/compiler/index.ts
  • packages/db/src/query/live/ARCHITECTURE.md
  • packages/db/tests/query/includes-oracle.property.test.ts
  • packages/db/tests/query/includes-scope-identity-oracle.ts
  • packages/db/tests/query/validate-aliases.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 3 remain after this review.


📝 Walkthrough

Walkthrough

The query optimizer preserves collection source identity through rewrites. The compiler resolves collection inputs by source ID and rejects duplicate or shadowing aliases in query scopes. Tests cover legal sibling-scope alias reuse and invalid alias collisions.

Changes

Query Scope Identity

Layer / File(s) Summary
Preserve source identity
packages/db/src/query/optimizer.ts, packages/db/src/query/compiler/index.ts, packages/db/src/query/compiler/joins.ts, packages/db/src/query/live/ARCHITECTURE.md, docs/contributing/oracle-reviews/issue-1975-scope-identity.md
Optimizer rewrites retain collection references. Compiler input binding and join processing resolve collection inputs by source ID, without alias fallback. The architecture and issue records describe the identity contract and the reported failure.
Validate aliases across scopes
packages/db/src/query/compiler/index.ts, packages/db/tests/query/validate-aliases.test.ts, packages/db/src/query/live/ARCHITECTURE.md, docs/contributing/oracle-reviews/issue-1975-scope-identity.md, .changeset/keep-source-identity-across-scopes.md
Compilation rejects duplicate aliases in a query and aliases that shadow visible ancestors. Tests cover rejected collisions and legal alias reuse across sibling scopes and union branches.
Verify scoped alias behavior
packages/db/tests/query/includes-scope-identity-oracle.ts, packages/db/tests/query/includes-oracle.property.test.ts, packages/db/tests/oracle-config.ts, packages/db/tests/oracle-replay-manifest.ts, packages/db/src/query/live/ARCHITECTURE.md, docs/contributing/oracle-reviews/issue-1975-scope-identity.md
The scoped-alias oracle compares query results with model recomputation and checks on-demand requests across generated and pinned scenarios. Oracle configuration, architecture contracts, and the issue record describe the test coverage.

Priority: ➖ Normal

Estimated code review effort: 4 (Complex) | ~45 minutes

Change: Bug fix · Severity of issue fixed: Medium

Merge Risk: ⚪ Minimal · up to 62d7a

The change preserves collection identity across query rewrites and explicitly rejects ambiguous aliases. No actionable merge-blocking risk remains; merge after normal checks pass.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 62d7a

The change prevents lost source identities from silently selecting a same-named input and rejects ambiguous query aliases. No new privilege or data-access boundary is demonstrated. Compatibility with existing callers and some advanced query-loading behavior remain only partly verified.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The demonstrated security-relevant scope is query result and input selection among caller-supplied collections, including joined and nested include queries. The inspected entrypoints do not demonstrate newly gained service, tenant, credential, or infrastructure authority; application-level exposure is not established by this repository evidence.

Trust Boundaries and Controls

  • observed — User-declared alias structure is checked before optimization. Compilation consumes bound source identities, and absent identities raise an error instead of selecting an input through alias fallback. These controls protect query-scope and input-selection integrity without replacing application authorization.

Resilience and Maintainability Implications

  • observed — Inspected lifecycle paths compile before acquiring source subscriptions. Later startup failures run registered cleanup, and one-shot queries retain finally-based cleanup. This contains the new validation and missing-identity failures without demonstrating a stranded live subscription.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 24 functions across 8 files. (2 skipped: … Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Issue #1975 requires that alias reuse in a materialized subquery does not silently remove live-query rows. The PR preserves CollectionRef SourceId values through optimizer rewrites and resolves compil…
Out of Scope Changes check ✅ Passed The changes stay within issue #1975. Compiler and optimizer changes implement source-identity resolution. Alias validation prevents related ambiguous scope patterns. Tests, architecture documentation,…
Title check ✅ Passed The title clearly and concisely describes the main change: preserving source identity across query scopes in the database package.
Description check ✅ Passed The description is detailed and covers the change, motivation, implementation, limitations, release changeset, and verification results. It does not reproduce the template headings or checkbox format …
Full details: Docstring Coverage

Explanation

Docstring coverage is 41.67% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 24 functions across 8 files. (2 skipped: 2 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


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.

@pkg-pr-new

pkg-pr-new Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
More templates

@tanstack/angular-db

npm i https://pkg.pr.new/@tanstack/angular-db@1981

@tanstack/browser-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/browser-db-sqlite-persistence@1981

@tanstack/capacitor-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/capacitor-db-sqlite-persistence@1981

@tanstack/cloudflare-durable-objects-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/cloudflare-durable-objects-db-sqlite-persistence@1981

@tanstack/db

npm i https://pkg.pr.new/@tanstack/db@1981

@tanstack/db-ivm

npm i https://pkg.pr.new/@tanstack/db-ivm@1981

@tanstack/db-sqlite-persistence-core

npm i https://pkg.pr.new/@tanstack/db-sqlite-persistence-core@1981

@tanstack/electric-db-collection

npm i https://pkg.pr.new/@tanstack/electric-db-collection@1981

@tanstack/electron-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/electron-db-sqlite-persistence@1981

@tanstack/expo-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/expo-db-sqlite-persistence@1981

@tanstack/node-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/node-db-sqlite-persistence@1981

@tanstack/offline-transactions

npm i https://pkg.pr.new/@tanstack/offline-transactions@1981

@tanstack/powersync-db-collection

npm i https://pkg.pr.new/@tanstack/powersync-db-collection@1981

@tanstack/query-db-collection

npm i https://pkg.pr.new/@tanstack/query-db-collection@1981

@tanstack/react-db

npm i https://pkg.pr.new/@tanstack/react-db@1981

@tanstack/react-native-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/react-native-db-sqlite-persistence@1981

@tanstack/react-router-with-db

npm i https://pkg.pr.new/@tanstack/react-router-with-db@1981

@tanstack/rxdb-db-collection

npm i https://pkg.pr.new/@tanstack/rxdb-db-collection@1981

@tanstack/solid-db

npm i https://pkg.pr.new/@tanstack/solid-db@1981

@tanstack/svelte-db

npm i https://pkg.pr.new/@tanstack/svelte-db@1981

@tanstack/tauri-db-sqlite-persistence

npm i https://pkg.pr.new/@tanstack/tauri-db-sqlite-persistence@1981

@tanstack/trailbase-db-collection

npm i https://pkg.pr.new/@tanstack/trailbase-db-collection@1981

@tanstack/vue-db

npm i https://pkg.pr.new/@tanstack/vue-db@1981

commit: 62d7a8f

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

Size Change: +156 B (+0.09%)

Total Size: 175 kB

📦 View Changed
Filename Size Change
packages/db/dist/esm/query/compiler/index.js 9.39 kB +175 B (+1.9%)
packages/db/dist/esm/query/compiler/joins.js 3.06 kB -4 B (-0.13%)
packages/db/dist/esm/query/optimizer.js 2.92 kB -15 B (-0.51%)
ℹ️ View Unchanged
Filename Size
packages/db/dist/esm/client.js 3.61 kB
packages/db/dist/esm/collection-options.js 236 B
packages/db/dist/esm/collection/change-events.js 2.07 kB
packages/db/dist/esm/collection/changes.js 2.72 kB
packages/db/dist/esm/collection/cleanup-queue.js 808 B
packages/db/dist/esm/collection/events.js 481 B
packages/db/dist/esm/collection/index.js 4.46 kB
packages/db/dist/esm/collection/indexes.js 2.06 kB
packages/db/dist/esm/collection/lifecycle.js 2.63 kB
packages/db/dist/esm/collection/mutations.js 2.59 kB
packages/db/dist/esm/collection/state.js 8.32 kB
packages/db/dist/esm/collection/subscription.js 8.63 kB
packages/db/dist/esm/collection/sync.js 4.96 kB
packages/db/dist/esm/collection/transaction-metadata.js 144 B
packages/db/dist/esm/deferred.js 207 B
packages/db/dist/esm/errors.js 5.49 kB
packages/db/dist/esm/event-emitter.js 961 B
packages/db/dist/esm/index.js 3.94 kB
packages/db/dist/esm/indexes/auto-index.js 841 B
packages/db/dist/esm/indexes/base-index.js 1.25 kB
packages/db/dist/esm/indexes/basic-index.js 2.01 kB
packages/db/dist/esm/indexes/btree-index.js 2.3 kB
packages/db/dist/esm/indexes/index-registry.js 820 B
packages/db/dist/esm/indexes/reverse-index.js 370 B
packages/db/dist/esm/live-query-adapter.js 318 B
packages/db/dist/esm/live-query-observer.js 4.53 kB
packages/db/dist/esm/live-query-options.js 731 B
packages/db/dist/esm/live-query-window-controller.js 4.12 kB
packages/db/dist/esm/local-only.js 989 B
packages/db/dist/esm/local-storage.js 2.17 kB
packages/db/dist/esm/optimistic-action.js 359 B
packages/db/dist/esm/paced-mutations.js 702 B
packages/db/dist/esm/persisted-readiness.js 195 B
packages/db/dist/esm/proxy.js 3.32 kB
packages/db/dist/esm/query/builder/clone-query.js 766 B
packages/db/dist/esm/query/builder/functions.js 1.45 kB
packages/db/dist/esm/query/builder/index.js 6.79 kB
packages/db/dist/esm/query/builder/query-ir.js 116 B
packages/db/dist/esm/query/builder/ref-proxy-identity.js 198 B
packages/db/dist/esm/query/builder/ref-proxy.js 1.35 kB
packages/db/dist/esm/query/builder/wrapper-identity.js 221 B
packages/db/dist/esm/query/compiler/evaluators.js 2.1 kB
packages/db/dist/esm/query/compiler/expressions.js 603 B
packages/db/dist/esm/query/compiler/group-by.js 4.2 kB
packages/db/dist/esm/query/compiler/lazy-targets.js 1.14 kB
packages/db/dist/esm/query/compiler/order-by.js 2 kB
packages/db/dist/esm/query/compiler/parent-routes.js 319 B
packages/db/dist/esm/query/compiler/query-equivalence.js 455 B
packages/db/dist/esm/query/compiler/route-metadata.js 1.24 kB
packages/db/dist/esm/query/compiler/select.js 1.59 kB
packages/db/dist/esm/query/effect.js 4.86 kB
packages/db/dist/esm/query/equality-value-identity.js 591 B
packages/db/dist/esm/query/expression-helpers.js 1.45 kB
packages/db/dist/esm/query/ir-stable-identity.js 4.22 kB
packages/db/dist/esm/query/ir.js 1.69 kB
packages/db/dist/esm/query/live-query-collection.js 391 B
packages/db/dist/esm/query/live/bucket-facade-adapter.js 2.67 kB
packages/db/dist/esm/query/live/collection-config-builder.js 6.47 kB
packages/db/dist/esm/query/live/collection-registry.js 264 B
packages/db/dist/esm/query/live/collection-subscriber.js 2.05 kB
packages/db/dist/esm/query/live/graph-scheduler.js 303 B
packages/db/dist/esm/query/live/internal.js 145 B
packages/db/dist/esm/query/live/materialized-pipeline.js 2.32 kB
packages/db/dist/esm/query/live/ordered-source-loader.js 4.14 kB
packages/db/dist/esm/query/live/subset-demand-controller.js 1.65 kB
packages/db/dist/esm/query/live/utils.js 1.2 kB
packages/db/dist/esm/query/query-once.js 359 B
packages/db/dist/esm/query/runtime-reference-identity.js 630 B
packages/db/dist/esm/query/subset-dedupe.js 493 B
packages/db/dist/esm/scheduler.js 1.13 kB
packages/db/dist/esm/SortedMap.js 1.58 kB
packages/db/dist/esm/strategies/debounceStrategy.js 331 B
packages/db/dist/esm/strategies/queueStrategy.js 488 B
packages/db/dist/esm/strategies/throttleStrategy.js 386 B
packages/db/dist/esm/sync-persistence.js 530 B
packages/db/dist/esm/transactions.js 3.89 kB
packages/db/dist/esm/utils.js 1.22 kB
packages/db/dist/esm/utils/array-utils.js 270 B
packages/db/dist/esm/utils/browser-polyfills.js 304 B
packages/db/dist/esm/utils/btree.js 3.02 kB
packages/db/dist/esm/utils/callbacks.js 174 B
packages/db/dist/esm/utils/comparison.js 1.59 kB
packages/db/dist/esm/utils/cursor.js 677 B
packages/db/dist/esm/utils/error.js 167 B
packages/db/dist/esm/utils/get-or-create.js 155 B
packages/db/dist/esm/utils/index-optimization.js 2.42 kB
packages/db/dist/esm/utils/source-record.js 140 B
packages/db/dist/esm/utils/type-guards.js 230 B
packages/db/dist/esm/utils/uuid.js 449 B
packages/db/dist/esm/virtual-props.js 413 B

compressed-size-action::db-package-size

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Size Change: 0 B

Total Size: 8.51 kB

ℹ️ View Unchanged
Filename Size
packages/react-db/dist/esm/DbProvider.js 317 B
packages/react-db/dist/esm/HydrationBoundary.js 263 B
packages/react-db/dist/esm/index.js 330 B
packages/react-db/dist/esm/live-query-internals.js 282 B
packages/react-db/dist/esm/useLiveInfiniteQuery.js 1.93 kB
packages/react-db/dist/esm/useLiveQuery.js 3.3 kB
packages/react-db/dist/esm/useLiveQueryEffect.js 355 B
packages/react-db/dist/esm/useLiveSuspenseQuery.js 1.33 kB
packages/react-db/dist/esm/usePacedMutations.js 401 B

compressed-size-action::react-db-package-size

A union row holds the branches' projected fields, not their aliases, so
an include or join on a unionAll() query cannot see branch aliases. The
include-shadowing check exposed them anyway and rejected a query that
main accepts with correct rows. Includes now see only the parent's from
and join aliases. Branch aliases inside an include are still checked
against its ancestors.

Adds a unionParent oracle topology and pinned witnesses for both legal
union namings, and corrects the union scope rule in ARCHITECTURE.md.

Co-authored-by: Isaac <no-reply@databricks.com>
@KyleAMathews
KyleAMathews merged commit 5b85af0 into main Oct 1, 2026
12 checks passed
@KyleAMathews
KyleAMathews deleted the fix/issue-1975-source-identity branch October 1, 2026 16:55
@github-actions github-actions Bot mentioned this pull request Oct 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Live query returns no rows when materialize() reuses an alias joined inside a from() sub-query (regression in 0.11.0)

1 participant