From e2a4e3bfddf8ce2649b5ee34de59859e214985ca Mon Sep 17 00:00:00 2001 From: Timothy Studd Date: Sat, 13 Nov 2021 07:48:16 -0800 Subject: [PATCH] fix(compiler): Validate table alias references --- internal/compiler/resolve.go | 9 +++++++++ .../testdata/invalid_table_alias/mysql/query.sql | 12 ++++++++++++ .../testdata/invalid_table_alias/mysql/sqlc.json | 12 ++++++++++++ .../testdata/invalid_table_alias/mysql/stderr.txt | 2 ++ .../invalid_table_alias/postgresql/query.sql | 12 ++++++++++++ .../invalid_table_alias/postgresql/sqlc.json | 12 ++++++++++++ .../invalid_table_alias/postgresql/stderr.txt | 2 ++ 7 files changed, 61 insertions(+) create mode 100644 internal/endtoend/testdata/invalid_table_alias/mysql/query.sql create mode 100644 internal/endtoend/testdata/invalid_table_alias/mysql/sqlc.json create mode 100644 internal/endtoend/testdata/invalid_table_alias/mysql/stderr.txt create mode 100644 internal/endtoend/testdata/invalid_table_alias/postgresql/query.sql create mode 100644 internal/endtoend/testdata/invalid_table_alias/postgresql/sqlc.json create mode 100644 internal/endtoend/testdata/invalid_table_alias/postgresql/stderr.txt diff --git a/internal/compiler/resolve.go b/internal/compiler/resolve.go index e00b070dfe..f8c73109fd 100644 --- a/internal/compiler/resolve.go +++ b/internal/compiler/resolve.go @@ -147,11 +147,20 @@ func resolveCatalogRefs(c *catalog.Catalog, qc *QueryCatalog, rvs []*ast.RangeVa if original, ok := aliasMap[alias]; ok { search = []*ast.TableName{original} } else { + var located bool for _, fqn := range tables { if fqn.Name == alias { + located = true search = []*ast.TableName{fqn} } } + if !located { + return nil, &sqlerr.Error{ + Code: "42703", + Message: fmt.Sprintf("table alias \"%s\" does not exist", alias), + Location: left.Location, + } + } } } diff --git a/internal/endtoend/testdata/invalid_table_alias/mysql/query.sql b/internal/endtoend/testdata/invalid_table_alias/mysql/query.sql new file mode 100644 index 0000000000..4c06fa07a0 --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/mysql/query.sql @@ -0,0 +1,12 @@ +-- https://github.com/kyleconroy/sqlc/issues/437 +CREATE TABLE authors ( + id INT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + bio text +); + +-- name: GetAuthor :one +SELECT * +FROM authors a +WHERE p.id = ? +LIMIT 1; diff --git a/internal/endtoend/testdata/invalid_table_alias/mysql/sqlc.json b/internal/endtoend/testdata/invalid_table_alias/mysql/sqlc.json new file mode 100644 index 0000000000..534b7e24e9 --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/mysql/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "mysql", + "name": "querytest", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/endtoend/testdata/invalid_table_alias/mysql/stderr.txt b/internal/endtoend/testdata/invalid_table_alias/mysql/stderr.txt new file mode 100644 index 0000000000..d4c26d650f --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/mysql/stderr.txt @@ -0,0 +1,2 @@ +# package querytest +query.sql:9:1: table alias "p" does not exist diff --git a/internal/endtoend/testdata/invalid_table_alias/postgresql/query.sql b/internal/endtoend/testdata/invalid_table_alias/postgresql/query.sql new file mode 100644 index 0000000000..232805a4ef --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/postgresql/query.sql @@ -0,0 +1,12 @@ +-- https://github.com/kyleconroy/sqlc/issues/437 +CREATE TABLE authors ( + id BIGSERIAL PRIMARY KEY, + name text NOT NULL, + bio text +); + +-- name: GetAuthor :one +SELECT * +FROM authors a +WHERE p.id = $1 +LIMIT 1; diff --git a/internal/endtoend/testdata/invalid_table_alias/postgresql/sqlc.json b/internal/endtoend/testdata/invalid_table_alias/postgresql/sqlc.json new file mode 100644 index 0000000000..af57681f66 --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/postgresql/sqlc.json @@ -0,0 +1,12 @@ +{ + "version": "1", + "packages": [ + { + "path": "go", + "engine": "postgresql", + "name": "querytest", + "schema": "query.sql", + "queries": "query.sql" + } + ] +} diff --git a/internal/endtoend/testdata/invalid_table_alias/postgresql/stderr.txt b/internal/endtoend/testdata/invalid_table_alias/postgresql/stderr.txt new file mode 100644 index 0000000000..810c893a70 --- /dev/null +++ b/internal/endtoend/testdata/invalid_table_alias/postgresql/stderr.txt @@ -0,0 +1,2 @@ +# package querytest +query.sql:11:9: table alias "p" does not exist