mirror of
https://github.com/featurebasedb/featurebase.git
synced 2026-08-28 02:44:59 +00:00
FB-1795: Implement REVERSE() scalar string function (#2335)
This commit is contained in:
parent
e599f12ee4
commit
d33bf4811f
5 changed files with 78 additions and 0 deletions
|
|
@ -1476,6 +1476,8 @@ func (n *callPlanExpression) Evaluate(currentRow []interface{}) (interface{}, er
|
|||
return n.EvaluateSetContainsAll(currentRow)
|
||||
case "DATEPART":
|
||||
return n.EvaluateDatepart(currentRow)
|
||||
case "REVERSE":
|
||||
return n.EvaluateReverse(currentRow)
|
||||
default:
|
||||
return nil, sql3.NewErrInternalf("unhandled function name '%s'", n.name)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -241,6 +241,8 @@ func (p *ExecutionPlanner) analyzeCallExpression(call *parser.Call, scope parser
|
|||
|
||||
case "SUBTABLE":
|
||||
return p.analyzeFunctionSubtable(call, scope)
|
||||
case "REVERSE":
|
||||
return p.analyseFunctionReverse(call, scope)
|
||||
|
||||
default:
|
||||
return nil, sql3.NewErrCallUnknownFunction(call.Name.NamePos.Line, call.Name.NamePos.Column, call.Name.Name)
|
||||
|
|
|
|||
41
sql3/planner/inbuiltfunctionsstring.go
Normal file
41
sql3/planner/inbuiltfunctionsstring.go
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
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
|
||||
}
|
||||
|
|
@ -23,6 +23,7 @@ var TableTests []TableTest = []TableTest{
|
|||
setFunctionTests,
|
||||
setParameterTests,
|
||||
datePartTests,
|
||||
stringScalarFunctionsTests,
|
||||
|
||||
insertTest,
|
||||
keyedInsertTest,
|
||||
|
|
|
|||
32
sql3/test/defs/defs_string_functions.go
Normal file
32
sql3/test/defs/defs_string_functions.go
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
package defs
|
||||
|
||||
// string function tests
|
||||
var stringScalarFunctionsTests = TableTest{
|
||||
|
||||
Table: tbl(
|
||||
"stringscalarfunctions",
|
||||
srcHdrs(
|
||||
srcHdr("_id", fldTypeID),
|
||||
srcHdr("a", fldTypeInt, "min 0", "max 1000"),
|
||||
srcHdr("b", fldTypeInt, "min 0", "max 1000"),
|
||||
srcHdr("ts", fldTypeTimestamp),
|
||||
),
|
||||
srcRows(
|
||||
srcRow(int64(1), int64(10), int64(100), knownTimestamp()),
|
||||
),
|
||||
),
|
||||
SQLTests: []SQLTest{
|
||||
{
|
||||
SQLs: sqls(
|
||||
"select reverse('this')",
|
||||
),
|
||||
ExpHdrs: hdrs(
|
||||
hdr("", fldTypeString),
|
||||
),
|
||||
ExpRows: rows(
|
||||
row(string("siht")),
|
||||
),
|
||||
Compare: CompareExactUnordered,
|
||||
},
|
||||
},
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue