Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Boolean created by comparing two not null timestamps is incorrectly nullable. #199

Open
kfajdsl opened this issue Jan 14, 2024 · 2 comments
Labels
bug Something isn't working

Comments

@kfajdsl
Copy link

kfajdsl commented Jan 14, 2024

Describe the bug
When comparing two not null timestamps, the result will never be null, but SafeQL interprets it at nullable.

To Reproduce
Steps to reproduce the behavior:
Create a table with a NOT NULL timestampz column:

CREATE TABLE token (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  expires_at TIMESTAMPZ NOT NULL DEFAULT NOW()
);

Query that table, checking if the timestamp is in the past:

  const tokenExpired = (await sql<{ expired: boolean; }[]>`
    SELECT expires_at < NOW() AS expired
    FROM token
    WHERE id = ${tokenId}
  `)[0]?.expired;

SafeQL now reports an error,

Query has incorrect type annotation.
	Expected: { expired: boolean; }
	Actual: { expired: boolean | null; }[]

Expected behavior
SafeQL doesn't report an error.

Desktop (please complete the following information):

  • OS: macOS
  • PostgreSQL version: 16.1
@kfajdsl
Copy link
Author

kfajdsl commented Jan 14, 2024

I also get this problem with a timestampz that is created as the result of adding an interval to a timestampz.

@Newbie012 Newbie012 added the bug Something isn't working label Jan 14, 2024
@Newbie012
Copy link
Collaborator

Good catch. As a workaround for now, you could wrap the condition with coalesce. I will push a new version soon that should fix it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants