@@ -21,24 +21,28 @@ import (
2121 "github.com/dolthub/go-mysql-server/sql"
2222)
2323
24- var _ sql.TableFunction = & TableFunction {}
25- var _ sql.ExecSourceRel = & TableFunction {}
24+ var _ sql.TableFunction = & TableFunctionWrapper {}
25+ var _ sql.ExecSourceRel = & TableFunctionWrapper {}
2626
27- type TableFunction struct {
27+ // TableFunctionWrapper represents a table function with underlying
28+ // regular function. It allows using regular function as table function.
29+ type TableFunctionWrapper struct {
2830 underlyingFunc sql.Function
2931
3032 args []sql.Expression
3133 database sql.Database
3234 funcExpr sql.Expression
3335}
3436
35- func NewTableFunction (f sql.Function ) sql.TableFunction {
36- return & TableFunction {
37+ // NewTableFunctionWrapper creates new TableFunction
38+ // with given Function as underlying function.
39+ func NewTableFunctionWrapper (f sql.Function ) sql.TableFunction {
40+ return & TableFunctionWrapper {
3741 underlyingFunc : f ,
3842 }
3943}
4044
41- func (t * TableFunction ) NewInstance (ctx * sql.Context , db sql.Database , args []sql.Expression ) (sql.Node , error ) {
45+ func (t * TableFunctionWrapper ) NewInstance (ctx * sql.Context , db sql.Database , args []sql.Expression ) (sql.Node , error ) {
4246 nt := * t
4347 nt .database = db
4448 nt .args = args
@@ -50,67 +54,77 @@ func (t *TableFunction) NewInstance(ctx *sql.Context, db sql.Database, args []sq
5054 return & nt , nil
5155}
5256
53- func (t * TableFunction ) Children () []sql.Node {
57+ func (t * TableFunctionWrapper ) Children () []sql.Node {
5458 return nil
5559}
5660
57- func (t * TableFunction ) Database () sql.Database {
61+ func (t * TableFunctionWrapper ) Database () sql.Database {
5862 return t .database
5963}
6064
61- func (t * TableFunction ) Expressions () []sql.Expression {
65+ func (t * TableFunctionWrapper ) Expressions () []sql.Expression {
66+ if t .funcExpr == nil {
67+ return nil
68+ }
6269 return t .funcExpr .Children ()
6370}
6471
65- func (t * TableFunction ) IsReadOnly () bool {
72+ func (t * TableFunctionWrapper ) IsReadOnly () bool {
6673 return true
6774}
6875
69- func (t * TableFunction ) Name () string {
76+ func (t * TableFunctionWrapper ) Name () string {
7077 return t .underlyingFunc .FunctionName ()
7178}
7279
73- func (t * TableFunction ) RowIter (ctx * sql.Context , r sql.Row ) (sql.RowIter , error ) {
80+ func (t * TableFunctionWrapper ) RowIter (ctx * sql.Context , r sql.Row ) (sql.RowIter , error ) {
7481 v , err := t .funcExpr .Eval (ctx , r )
7582 if err != nil {
7683 return nil , err
7784 }
7885 return sql .RowsToRowIter (sql.Row {v }), nil
7986}
8087
81- func (t * TableFunction ) Resolved () bool {
88+ func (t * TableFunctionWrapper ) Resolved () bool {
8289 for _ , expr := range t .args {
83- return expr .Resolved ()
90+ if ! expr .Resolved () {
91+ return false
92+ }
8493 }
8594 return true
8695}
8796
88- func (t * TableFunction ) Schema () sql.Schema {
97+ func (t * TableFunctionWrapper ) Schema () sql.Schema {
8998 return sql.Schema {& sql.Column {Name : t .underlyingFunc .FunctionName (), Type : t .funcExpr .Type ()}}
9099}
91100
92- func (t * TableFunction ) String () string {
101+ func (t * TableFunctionWrapper ) String () string {
93102 var args []string
94103 for _ , expr := range t .args {
95104 args = append (args , expr .String ())
96105 }
97106 return fmt .Sprintf ("%s(%s)" , t .underlyingFunc .FunctionName (), strings .Join (args , ", " ))
98107}
99108
100- func (t * TableFunction ) WithChildren (children ... sql.Node ) (sql.Node , error ) {
109+ func (t * TableFunctionWrapper ) WithChildren (children ... sql.Node ) (sql.Node , error ) {
101110 if len (children ) != 0 {
102- return nil , fmt . Errorf ( "unexpected children" )
111+ return nil , sql . ErrInvalidChildrenNumber . New ( t , len ( children ), 0 )
103112 }
104113 return t , nil
105114}
106115
107- func (t * TableFunction ) WithDatabase (database sql.Database ) (sql.Node , error ) {
116+ func (t * TableFunctionWrapper ) WithDatabase (database sql.Database ) (sql.Node , error ) {
108117 nt := * t
109118 nt .database = database
110119 return & nt , nil
111120}
112121
113- func (t * TableFunction ) WithExpressions (exprs ... sql.Expression ) (sql.Node , error ) {
122+ func (t * TableFunctionWrapper ) WithExpressions (exprs ... sql.Expression ) (sql.Node , error ) {
123+ if t .funcExpr == nil {
124+ if len (exprs ) != 0 {
125+ return nil , sql .ErrInvalidChildrenNumber .New (t , len (exprs ), 0 )
126+ }
127+ }
114128 l := len (t .funcExpr .Children ())
115129 if len (exprs ) != l {
116130 return nil , sql .ErrInvalidChildrenNumber .New (t , len (exprs ), l )
0 commit comments