Skip to content

Non-valid subquery generation #4223

@TobiasGleiter

Description

@TobiasGleiter

Version

1.30.0

What happened?

SQLC generates Go code for a non-valid subquery.

Relevant log output

SQL logic error: no such column: locations.project_id (1)

Database schema

CREATE TABLE IF NOT EXISTS organization_roles (
    id INTEGER PRIMARY KEY,
    name TEXT UNIQUE NOT NULL
) STRICT;

CREATE TABLE IF NOT EXISTS organizations (
    id INTEGER PRIMARY KEY,
    public_id TEXT UNIQUE NOT NULL,
    display_name TEXT NOT NULL,
    slug TEXT UNIQUE NOT NULL,
    phone TEXT,
    contact_email TEXT,
    country_code TEXT DEFAULT 'DE',
    address_line_1 TEXT,
    address_line_2 TEXT,
    postal_code INTEGER,
    city TEXT,
    state_province TEXT,
    created_at INTEGER NOT NULL DEFAULT (unixepoch()),
    updated_at INTEGER NOT NULL DEFAULT (unixepoch())
) STRICT;

CREATE TABLE IF NOT EXISTS organization_members (
    id INTEGER PRIMARY KEY,
    public_id TEXT UNIQUE NOT NULL,
    account_id INTEGER NOT NULL,
    organization_id INTEGER NOT NULL,
    role_id INTEGER NOT NULL,
    created_at INTEGER NOT NULL DEFAULT (unixepoch()),
    updated_at INTEGER NOT NULL DEFAULT (unixepoch()),
    FOREIGN KEY (account_id) REFERENCES accounts(id) ON DELETE CASCADE,
    FOREIGN KEY (organization_id) REFERENCES organizations(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES organization_roles(id) ON DELETE RESTRICT,
    UNIQUE(account_id, organization_id)
) STRICT;

CREATE TABLE IF NOT EXISTS projects (
    id INTEGER PRIMARY KEY,
    public_id TEXT NOT NULL UNIQUE,
    organization_id INTEGER NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
    created_by_account_id INTEGER REFERENCES accounts(id) ON DELETE SET NULL,
    name TEXT NOT NULL,
    description TEXT,
    show_organization_info INTEGER NOT NULL DEFAULT 1,
    created_at INTEGER NOT NULL DEFAULT (unixepoch()),
    updated_at INTEGER NOT NULL DEFAULT (unixepoch())
) STRICT;

CREATE TABLE IF NOT EXISTS locations (
    id INTEGER PRIMARY KEY,
    public_id TEXT UNIQUE NOT NULL,
    project_id INTEGER NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
    name TEXT NOT NULL,
    notes TEXT,
    latitude REAL,
    longitude REAL,
    created_at INTEGER NOT NULL DEFAULT (unixepoch()),
    updated_at INTEGER NOT NULL DEFAULT (unixepoch())
) STRICT;

SQL queries

-- name: GetByPublicID :one
-- Invalid subquery with location.project_id
SELECT *
FROM locations l
WHERE l.public_id = ?
AND EXISTS (
    SELECT 1
    FROM projects p
    JOIN organization_members om ON p.organization_id = om.organization_id
    WHERE 
        p.id = location.project_id
        AND om.account_id = ?
);

-- name: GetByPublicID :one
-- Valid with subquery with l.project_id
SELECT *
FROM locations l
WHERE l.public_id = ?
AND EXISTS (
    SELECT 1
    FROM projects p
    JOIN organization_members om ON p.organization_id = om.organization_id
    WHERE 
        p.id = l.project_id
        AND om.account_id = ?
);

Configuration

- engine: "sqlite"
    queries: "locations.sql"
    schema:
      - "db/migrations/*project*.sql"
      - "db/migrations/*location*.sql"
      - "db/migrations/*organization*.sql"

Playground URL

No response

What operating system are you using?

macOS

What database engines are you using?

SQLite

What type of code are you generating?

Go

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions