Skip to content

Conversation

@krleonid
Copy link
Owner

When querying a table in a non-existent schema, the error message now correctly indicates that the schema does not exist, rather than saying the table does not exist.

The new error message format is:
'Catalog with name does not exist and there is no schema in the current catalog!'

This provides clearer feedback to users when they reference a schema that doesn't exist, making it easier to identify and fix the issue.

Changes:

  • Added logic in Catalog::TryLookupEntry to detect when a schema doesn't exist and throw an appropriate error
  • Simplified code by removing redundant checks
  • Added comprehensive tests for various scenarios including:
    • Non-existent schema without catalog specification
    • Non-existent schema with catalog specification
    • Non-existent table in existing schema (still shows table error)
    • Multiple catalog scenarios

When querying a table in a non-existent schema, the error message
now correctly indicates that the schema does not exist, rather than
saying the table does not exist.

The new error message format is:
'Catalog with name <schema> does not exist and there is no <schema> schema in the current catalog!'

This provides clearer feedback to users when they reference a schema
that doesn't exist, making it easier to identify and fix the issue.

Changes:
- Added logic in Catalog::TryLookupEntry to detect when a schema
  doesn't exist and throw an appropriate error
- Simplified code by removing redundant checks
- Added comprehensive tests for various scenarios including:
  - Non-existent schema without catalog specification
  - Non-existent schema with catalog specification
  - Non-existent table in existing schema (still shows table error)
  - Multiple catalog scenarios
- Add check to only apply schema error logic when looking for TABLE_ENTRY
- This prevents incorrect schema errors for column.method calls like filename.replace()
- Update test expectations to match new accurate error messages
- All tests pass including dot_function_missing_error.test
Updated error message from 'Catalog with name X does not exist and there is no X schema in the current catalog!' to 'the relation "schema.table" does not exist' format. This provides clearer error messages showing the full qualified relation name.
- Updated catalog.cpp to generate error message in format 'the relation "schema.table" does not exist'
- Updated all test files to expect the new error message format
- Fixed remaining occurrences in test_schema.test and test_schema_dependency.test
Changed error message from 'the relation "schema.table" does not exist' to 'Table with name "schema.table" does not exist because schema "schema" does not exist.' to provide clearer information about why the table lookup failed.
@krleonid krleonid merged commit 920a868 into main Dec 30, 2025
67 of 69 checks passed
krleonid pushed a commit that referenced this pull request Jan 14, 2026
…0283)

Fix for: duckdblabs/duckdb-internal#6809 ,
duckdb#20086

I would like someone to take a look at this before I run CI, to see if
the fix makes sense.

In ConstantOrNullFunction, there is a bug where if the first loop
iteration is a FLAT_VECTOR, the result validity mask is created as a
reference to the validity mask of args.data[idx]. If the subsequent
iteration is the default branch (say, a DICTIONARY_VECTOR), and we call
result_mask.SetInvalid(i), this is now overwriting the validity mask of
the first input column where the reference was created.

I believe the fix for this is to call EnsureWritable in the FLAT_VECTOR
case, to make sure the validity mask is not a reference to the input's
validity mask before we call

```cpp
result_mask.Combine(input_mask, args.size()) 
```
(which is where the alias is actually created). 

The reproducer hits this case -- a specific scenario of unique index +
update + no checkpointing was leading to the this scenario.

For reference, here is the query plan of the last query in the
reproducer, where the bug was occuring. The t1.c0 column is being passed
as a FLAT_VECTOR to constantOrNullFunction, and the t0.c1 column is
being passed in as a dictionary vector. Since the argument at index 1 in
ConstantOrNullFunction is the c0 column in the output, we were
overwriting NULLs into the ouput since the filter was overwriting the
validity mask in ConstantOrNullFunction:

```
┌───────┬───────┬───────┐
│  c0   │  c0   │  c1   │
│ int32 │ int32 │ int32 │
├───────┼───────┼───────┤
│  NULL │     1 │  NULL │
│  NULL │    -1 │  NULL │
└───────┴───────┴───────┘
```

Whereas it should be: 

```
┌───────┬───────┬───────┐
│  c0   │  c0   │  c1   │
│ int32 │ int32 │ int32 │
├───────┼───────┼───────┤
│     0 │     1 │  NULL │
│  NULL │    -1 │  NULL │
└───────┴───────┴───────┘
```

```┌────────────────────────────────────────────────┐
│┌──────────────────────────────────────────────┐│
││               Total Time: 9.18s              ││
│└──────────────────────────────────────────────┘│
└────────────────────────────────────────────────┘
┌───────────────────────────┐
│           QUERY           │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│      EXPLAIN_ANALYZE      │
│    ────────────────────   │
│           0 rows          │
│          (0.00s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         PROJECTION        │
│    ────────────────────   │
│             c0            │
│             c0            │
│             c1            │
│                           │
│           2 rows          │
│          (0.00s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         PROJECTION        │
│    ────────────────────   │
│             #3            │
│             #7            │
│            #11            │
│                           │
│           2 rows          │
│          (0.00s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│           FILTER          │
│    ────────────────────   │
│  (constant_or_null(false, │
│      c0, c1) IS NULL)     │
│                           │
│           2 rows          │
│          (1.82s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         PROJECTION        │
│    ────────────────────   │
│            NULL           │
│             #6            │
│            NULL           │
│             #5            │
│            NULL           │
│             #4            │
│            NULL           │
│             #3            │
│            NULL           │
│             #2            │
│            NULL           │
│             #1            │
│            NULL           │
│             #0            │
│            NULL           │
│                           │
│           2 rows          │
│          (0.00s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│         PROJECTION        │
│    ────────────────────   │
│            NULL           │
│             #2            │
│            NULL           │
│             #1            │
│            NULL           │
│             #0            │
│            NULL           │
│                           │
│           2 rows          │
│          (0.00s)          │
└─────────────┬─────────────┘
┌─────────────┴─────────────┐
│      POSITIONAL_SCAN      │
│    ────────────────────   │
│           2 rows          ├──────────────┐
│          (7.30s)          │              │
└─────────────┬─────────────┘              │
┌─────────────┴─────────────┐┌─────────────┴─────────────┐
│         TABLE_SCAN        ││         TABLE_SCAN        │
│    ────────────────────   ││    ────────────────────   │
│         Table: t1         ││         Table: t0         │
│   Type: Sequential Scan   ││   Type: Sequential Scan   │
│      Projections: c0      ││                           │
│                           ││        Projections:       │
│                           ││             c1            │
│                           ││             c0            │
│                           ││                           │
│           0 rows          ││           0 rows          │
│          (0.00s)          ││          (0.00s)          │
└───────────────────────────┘└───────────────────────────┘
```
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.

2 participants