mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 10:54:59 +00:00
41 lines
1.1 KiB
Go
41 lines
1.1 KiB
Go
package planner
|
|
|
|
import (
|
|
"github.com/molecula/featurebase/v3/sql3"
|
|
"github.com/molecula/featurebase/v3/sql3/parser"
|
|
)
|
|
|
|
func (p *ExecutionPlanner) analyseFunctionReverse(call *parser.Call, scope parser.Statement) (parser.Expr, error) {
|
|
//one argument
|
|
if len(call.Args) != 1 {
|
|
return nil, sql3.NewErrCallParameterCountMismatch(call.Rparen.Line, call.Rparen.Column, call.Name.Name, 1, len(call.Args))
|
|
}
|
|
|
|
if !typeIsString(call.Args[0].DataType()) {
|
|
return nil, sql3.NewErrStringExpressionExpected(call.Args[0].Pos().Line, call.Args[0].Pos().Column)
|
|
}
|
|
|
|
call.ResultDataType = parser.NewDataTypeString()
|
|
|
|
return call, nil
|
|
}
|
|
|
|
// reverses the string
|
|
func (n *callPlanExpression) EvaluateReverse(currentRow []interface{}) (interface{}, error) {
|
|
argOneEval, err := n.args[0].Evaluate(currentRow)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
stringArgOne, ok := argOneEval.(string)
|
|
if !ok {
|
|
return nil, sql3.NewErrInternalf("unexpected type converion %T", argOneEval)
|
|
}
|
|
|
|
// reverse the string
|
|
runes := []rune(stringArgOne)
|
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
|
runes[i], runes[j] = runes[j], runes[i]
|
|
}
|
|
return string(runes), nil
|
|
}
|