@@ -31,6 +31,23 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
3131 return defaultName
3232 }
3333
34+ typeMap := map [string ]map [string ]map [string ]* catalog.Column {}
35+ indexTable := func (table catalog.Table ) error {
36+ tables = append (tables , table .Rel )
37+ if defaultTable == nil {
38+ defaultTable = table .Rel
39+ }
40+ if _ , exists := typeMap [table .Rel .Schema ]; ! exists {
41+ typeMap [table .Rel .Schema ] = map [string ]map [string ]* catalog.Column {}
42+ }
43+ typeMap [table .Rel .Schema ][table .Rel .Name ] = map [string ]* catalog.Column {}
44+ for _ , c := range table .Columns {
45+ cc := c
46+ typeMap [table .Rel .Schema ][table .Rel .Name ][c .Name ] = cc
47+ }
48+ return nil
49+ }
50+
3451 for _ , rv := range rvs {
3552 if rv .Relname == nil {
3653 continue
@@ -39,29 +56,16 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
3956 if err != nil {
4057 return nil , err
4158 }
42- tables = append (tables , fqn )
43- if defaultTable == nil {
44- defaultTable = fqn
45- }
46- if rv .Alias == nil {
47- continue
48- }
49- aliasMap [* rv .Alias .Aliasname ] = fqn
50- }
51-
52- typeMap := map [string ]map [string ]map [string ]* catalog.Column {}
53- for _ , fqn := range tables {
5459 table , err := c .GetTable (fqn )
5560 if err != nil {
5661 continue
5762 }
58- if _ , exists := typeMap [fqn .Schema ]; ! exists {
59- typeMap [fqn .Schema ] = map [string ]map [string ]* catalog.Column {}
63+ err = indexTable (table )
64+ if err != nil {
65+ return nil , err
6066 }
61- typeMap [fqn.Schema ][fqn.Name ] = map [string ]* catalog.Column {}
62- for _ , c := range table .Columns {
63- cc := c
64- typeMap [fqn.Schema ][fqn.Name ][c .Name ] = cc
67+ if rv .Alias != nil {
68+ aliasMap [* rv .Alias .Aliasname ] = fqn
6569 }
6670 }
6771
@@ -270,6 +274,23 @@ func resolveCatalogRefs(c *catalog.Catalog, rvs []*ast.RangeVar, args []paramRef
270274 })
271275 }
272276
277+ if fun .ReturnType == nil {
278+ continue
279+ }
280+
281+ table , err := c .GetTable (& ast.TableName {
282+ Catalog : fun .ReturnType .Catalog ,
283+ Schema : fun .ReturnType .Schema ,
284+ Name : fun .ReturnType .Name ,
285+ })
286+ if err != nil {
287+ // The return type wasn't a table.
288+ continue
289+ }
290+ err = indexTable (table )
291+ if err != nil {
292+ return nil , err
293+ }
273294 case * ast.ResTarget :
274295 if n .Name == nil {
275296 return nil , fmt .Errorf ("*ast.ResTarget has nil name" )
0 commit comments