Skip to content

Commit 07812e4

Browse files
committed
Lookup composite types when selecting from function
1 parent 88b3cb3 commit 07812e4

File tree

6 files changed

+86
-3
lines changed

6 files changed

+86
-3
lines changed

internal/compiler/output_columns.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,11 @@ func (c *Compiler) sourceTables(qc *QueryCatalog, node ast.Node) ([]*Table, erro
544544
Schema: fn.ReturnType.Schema,
545545
Name: fn.ReturnType.Name,
546546
})
547+
548+
// Successfully found the table
549+
if err != nil {
550+
table, err = qc.GetCompositeType(fn.ReturnType)
551+
}
547552
}
548553
if table == nil || err != nil {
549554
if n.Alias != nil && len(n.Alias.Colnames.Items) > 0 {

internal/compiler/query_catalog.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,3 +107,23 @@ func (qc QueryCatalog) GetFunc(rel *ast.FuncName) (*Function, error) {
107107
ReturnType: funcs[0].ReturnType,
108108
}, nil
109109
}
110+
111+
func (qc QueryCatalog) GetCompositeType(rel *ast.TypeName) (*Table, error) {
112+
ty, err := qc.catalog.GetCompostiteType(rel)
113+
if err != nil {
114+
return &Table{}, err
115+
}
116+
117+
tblName := &ast.TableName{
118+
Catalog: rel.Catalog,
119+
Schema: rel.Schema,
120+
Name: rel.Name,
121+
}
122+
123+
var cols []*Column
124+
for _, tyCol := range ty.Columns {
125+
cols = append(cols, ConvertColumn(tblName, tyCol))
126+
}
127+
128+
return &Table{Rel: tblName, Columns: cols}, nil
129+
}

internal/engine/postgresql/parse.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,9 +392,31 @@ func translate(node *nodes.Node) (ast.Node, error) {
392392
case *nodes.Node_CompositeTypeStmt:
393393
n := inner.CompositeTypeStmt
394394
rel := parseRelationFromRangeVar(n.Typevar)
395-
return &ast.CompositeTypeStmt{
395+
396+
stmt := &ast.CompositeTypeStmt{
396397
TypeName: rel.TypeName(),
397-
}, nil
398+
}
399+
400+
for _, elt := range n.GetColdeflist() {
401+
switch item := elt.Node.(type) {
402+
case *nodes.Node_ColumnDef:
403+
rel, err := parseRelationFromNodes(item.ColumnDef.TypeName.Names)
404+
if err != nil {
405+
return nil, err
406+
}
407+
408+
stmt.Cols = append(stmt.Cols, &ast.ColumnDef{
409+
Colname: item.ColumnDef.Colname,
410+
TypeName: rel.TypeName(),
411+
IsNotNull: false, // Composite types cannot have constraints
412+
IsArray: isArray(item.ColumnDef.TypeName),
413+
ArrayDims: len(item.ColumnDef.TypeName.ArrayBounds),
414+
PrimaryKey: false,
415+
})
416+
}
417+
}
418+
419+
return stmt, nil
398420

399421
case *nodes.Node_CreateStmt:
400422
n := inner.CreateStmt

internal/sql/ast/composite_type_stmt.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package ast
22

33
type CompositeTypeStmt struct {
44
TypeName *TypeName
5+
Cols []*ColumnDef
56
}
67

78
func (n *CompositeTypeStmt) Pos() int {

internal/sql/catalog/public.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,21 @@ func (c *Catalog) GetTable(rel *ast.TableName) (Table, error) {
131131
return *table, err
132132
}
133133
}
134+
135+
func (c *Catalog) GetCompostiteType(rel *ast.TypeName) (CompositeType, error) {
136+
ty, _, err := c.getType(rel)
137+
if err != nil {
138+
return CompositeType{}, err
139+
}
140+
141+
cTy, ok := ty.(*CompositeType)
142+
if !ok {
143+
return CompositeType{}, fmt.Errorf("Type %s is not a composite type", rel.Name)
144+
}
145+
146+
if ty == nil {
147+
return CompositeType{}, err
148+
} else {
149+
return *cTy, err
150+
}
151+
}

internal/sql/catalog/types.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ func (e *Enum) isType() {
3030
type CompositeType struct {
3131
Name string
3232
Comment string
33+
Columns []*Column
3334
}
3435

3536
func (ct *CompositeType) isType() {
@@ -135,8 +136,24 @@ func (c *Catalog) createCompositeType(stmt *ast.CompositeTypeStmt) error {
135136
if _, _, err := schema.getType(stmt.TypeName); err == nil {
136137
return sqlerr.TypeExists(tbl.Name)
137138
}
139+
140+
var cols []*Column
141+
for _, cDef := range stmt.Cols {
142+
cols = append(cols, &Column{
143+
Name: cDef.Colname,
144+
Type: *cDef.TypeName,
145+
IsNotNull: cDef.IsNotNull,
146+
IsUnsigned: cDef.IsUnsigned,
147+
IsArray: cDef.IsArray,
148+
ArrayDims: cDef.ArrayDims,
149+
Comment: cDef.Comment,
150+
Length: cDef.Length,
151+
})
152+
}
153+
138154
schema.Types = append(schema.Types, &CompositeType{
139-
Name: stmt.TypeName.Name,
155+
Name: stmt.TypeName.Name,
156+
Columns: cols,
140157
})
141158
return nil
142159
}

0 commit comments

Comments
 (0)