Skip to content

Commit 0707177

Browse files
authored
compiler: Return error if relation not found (#1059)
Fix panic when accessing defaultTable
1 parent 39be11b commit 0707177

File tree

5 files changed

+47
-7
lines changed

5 files changed

+47
-7
lines changed

internal/compiler/parse.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,11 @@ func (c *Compiler) parseQuery(stmt ast.Node, src string, o opts.Parser) (*Query,
8787
refs = uniqueParamRefs(refs)
8888
sort.Slice(refs, func(i, j int) bool { return refs[i].ref.Number < refs[j].ref.Number })
8989
}
90-
params, err := resolveCatalogRefs(c.catalog, rvs, refs, namedParams)
90+
qc, err := buildQueryCatalog(c.catalog, raw.Stmt)
9191
if err != nil {
9292
return nil, err
9393
}
94-
95-
qc, err := buildQueryCatalog(c.catalog, raw.Stmt)
94+
params, err := resolveCatalogRefs(c.catalog, qc, rvs, refs, namedParams)
9695
if err != nil {
9796
return nil, err
9897
}

internal/compiler/resolve.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func dataType(n *ast.TypeName) string {
1818
}
1919
}
2020

21-
func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef, names map[int]string) ([]Parameter, error) {
21+
func resolveCatalogRefs(c *catalog.Catalog, qc *QueryCatalog, rvs []*ast.RangeVar, args []paramRef, names map[int]string) ([]Parameter, error) {
2222
aliasMap := map[string]*ast.TableName{}
2323
// TODO: Deprecate defaultTable
2424
var defaultTable *ast.TableName
@@ -62,6 +62,10 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
6262
}
6363
table, err := c.GetTable(fqn)
6464
if err != nil {
65+
// If the table name doesn't exist, fisrt check if it's a CTE
66+
if _, qcerr := qc.GetTable(fqn); qcerr != nil {
67+
return nil, err
68+
}
6569
continue
6670
}
6771
err = indexTable(table)
@@ -299,15 +303,19 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
299303
if err != nil {
300304
return nil, err
301305
}
306+
302307
case *ast.ResTarget:
303308
if n.Name == nil {
304309
return nil, fmt.Errorf("*ast.ResTarget has nil name")
305310
}
306311
key := *n.Name
307312

313+
var schema, rel string
308314
// TODO: Deprecate defaultTable
309-
schema := defaultTable.Schema
310-
rel := defaultTable.Name
315+
if defaultTable != nil {
316+
schema = defaultTable.Schema
317+
rel = defaultTable.Name
318+
}
311319
if ref.rv != nil {
312320
fqn, err := ParseTableName(ref.rv)
313321
if err != nil {
@@ -319,7 +327,13 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
319327
if schema == "" {
320328
schema = c.DefaultSchema
321329
}
322-
if c, ok := typeMap[schema][rel][key]; ok {
330+
331+
tableMap, ok := typeMap[schema][rel]
332+
if !ok {
333+
return nil, sqlerr.RelationNotFound(rel)
334+
}
335+
336+
if c, ok := tableMap[key]; ok {
323337
a = append(a, Parameter{
324338
Number: ref.ref.Number,
325339
Column: &Column{
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
-- name: MissingSelect :many
2+
SELECT * FROM nonexisting_relation WHERE name = 'foo';
3+
4+
-- name: MissingParam :many
5+
SELECT * FROM nonexisting_relation WHERE name = $1;
6+
7+
-- name: MissingUpdate :exec
8+
UPDATE nonexisting_relation SET name = $1;
9+
10+
-- name: MisingInsert :exec
11+
INSERT INTO nonexisting_relation (id) VALUES ($1);
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"version": "1",
3+
"packages": [
4+
{
5+
"path": "go",
6+
"name": "querytest",
7+
"schema": "query.sql",
8+
"queries": "query.sql"
9+
}
10+
]
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# package querytest
2+
query.sql:1:1: relation "nonexisting_relation" does not exist
3+
query.sql:5:1: relation "nonexisting_relation" does not exist
4+
query.sql:8:1: relation "nonexisting_relation" does not exist
5+
query.sql:11:1: relation "nonexisting_relation" does not exist

0 commit comments

Comments
 (0)