featurebase/sql3/planner/userdefinedfunctions.go
Pat Okeeffe 284f62dcb9
create model, create function... all the goodies (#2264)
* create function, create/drop model; re-introduced limit; added COPY; var(); corr()

* review feedback
2023-04-04 17:44:29 -05:00

71 lines
2.2 KiB
Go

package planner
import (
"github.com/featurebasedb/featurebase/v3/sql3"
"github.com/featurebasedb/featurebase/v3/sql3/parser"
)
func (p *ExecutionPlanner) analyzeUserDefinedFunction(call *parser.Call, scope parser.Statement, function *functionSystemObject) (parser.Expr, error) {
// TODO(pok) removing user defined functions for now
// // hard code to 1 string parameter
// if len(call.Args) != 1 {
// return nil, sql3.NewErrCallParameterCountMismatch(call.Rparen.Line, call.Rparen.Column, call.Name.Name, 2, len(call.Args))
// }
// // arg 1
// argType := parser.NewDataTypeString()
// if !typesAreAssignmentCompatible(argType, call.Args[0].DataType()) {
// return nil, sql3.NewErrParameterTypeMistmatch(call.Args[0].Pos().Line, call.Args[0].Pos().Column, call.Args[0].DataType().TypeDescription(), argType.TypeDescription())
// }
// //return string
// call.ResultDataType = parser.NewDataTypeString()
// return call, nil
return nil, sql3.NewErrUnsupported(0, 0, false, "user defined functions")
}
func (n *callPlanExpression) evaluateUserDefinedFunction(currentRow []interface{}) (interface{}, error) {
// TODO(pok) removing what effectively is a remote code exploit
// we will come back to this to add sql udfs and external code later
// argEval, err := n.args[0].Evaluate(currentRow)
// if err != nil {
// return nil, err
// }
// // nil if anything is nil
// if argEval == nil {
// return nil, nil
// }
// //get the value
// coercedArg, err := coerceValue(n.args[0].Type(), parser.NewDataTypeString(), argEval, parser.Pos{Line: 0, Column: 0})
// if err != nil {
// return nil, err
// }
// arg, argOk := coercedArg.(string)
// if !argOk {
// return nil, sql3.NewErrInternalf("unable to convert value")
// }
// // save the body to a temp file
// file, err := os.CreateTemp("", "py-body")
// if err != nil {
// return nil, err
// }
// defer os.Remove(file.Name())
// file.Write([]byte(n.udfReference.body))
// cmd := exec.Command("python3", file.Name(), arg)
// stdout, err := cmd.Output()
// if err != nil {
// return nil, err
// }
// retVal := string(stdout)
// return retVal, nil
return nil, sql3.NewErrUnsupported(0, 0, false, "user defined functions")
}