FB-1795: Implement REVERSE() scalar string function (#2335)

This commit is contained in:
rachithrr 2022-12-08 04:01:30 +05:30 committed by GitHub
parent e599f12ee4
commit d33bf4811f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 78 additions and 0 deletions

View file

@ -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)
}

View file

@ -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)

View 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
}

View file

@ -23,6 +23,7 @@ var TableTests []TableTest = []TableTest{
setFunctionTests,
setParameterTests,
datePartTests,
stringScalarFunctionsTests,
insertTest,
keyedInsertTest,

View 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,
},
},
}